<?php
/*------------------------------------------------------------
  zeromail1.2 core
  
  var1.1->1.2  Ajaxへの対応（ロジック書き換え＋NOSCRIPT追加）
  			   メールアドレスを必須にするかどうかの設定(EMAILCHECK)追加
			   差出人名設定（FROMNAME）追加
			   ブロックするIPの設定（$blockIP）追加
			   エラーでセッションを破棄するように変更
			   ユーザー情報にIP追加と並べ替え
			   メールヘッダ変更（主にfrom）
			   エラー表示をテンプレート化（error.php）
			   Button()とMessage()をnoscript環境に対応させた
  var1.1->1.1.1  入力チェック強化
				 平仮名・片仮名のチェック追加
  			     メールアドレスを必須にするかどうかの設定(EMAILCHECK)追加
  var1.0->1.1  ファイル添付に対応
  			   自動返信name値"Reply"を削除
			   自動返信バグ修正
			   関数を外に出したり定数化したり
  var0.9->1.0  メールアドレスのチェックを細分化
  var0.8->0.9　メール返信の条件ミス修正
  var0.7->0.8  文字コード変換修正(confim.php)
               予約済みname値のif条件
			   ローマ字の名前に対応(フラグALPHANAME追加）
			   Message()で表示する文字にspanタグつけた
  var0.6->0.7  郵便番号をzipcodeにして正規表現にハイフンなし追加
  			　 電話番号の正規表現変更
			　 自動返信のname値にreply追加
			   checkboxとradioの必須チェック追加
  var0.5->0.6　指定エンコードへの変換を関数化
  var0.4->0.5　UTF-8以外の文字コードに対応など
  var0.3->0.4　メアドチェック正規表現変更
  var0.2->0.3　ケアレスミス修正＋mb関連設定追加
  ver0.1->0.2　複数設置対応
--------------------------------------------------------------*/

mb_language("Japanese");
mb_internal_encoding ('UTF-8');
mb_http_input("auto");
mb_http_output('UTF-8');
ini_set("default_charset", 'UTF-8');
define('PHPVER',phpversion());
//ini_set("display_errors", "On");//エラー表示ON

session_start();

if(isset($_POST['id']) xor isset($_SESSION['id'])){
	if($_POST['id']){
		$_SESSION['id']=$_POST['id'];
	}
	require_once('init'.$_SESSION['id'].'.php');
	
}else{
	require_once('init.php');
}

//Ajax使用状況（noscript=falseで使用とみなす）
if((isset($_POST['noscript']) && $_POST["noscript"]=="true") 
	|| (isset($_SESSION['noscript']) && $_SESSION["noscript"]=="true")
		||!array_key_exists("noscript",$_POST)){
	
	define("NOSCRIPT",true);
	
}elseif($_POST["noscript"]=="false"){
	define("NOSCRIPT",false);
}

if(isset($_POST)){

	if($_POST["mode"]==="Send"){
		zeromailAjax_send($_SESSION);
	}else{
		
		session_unset();
		
		//spam killer
		ip_check_destroy();
		ref_check_destroy();
	
		$formitem = value_check($_POST);
		
		if(NOSCRIPT===true){
			$_SESSION = array_merge($_SESSION,$formitem);
			header('Location: '.CHECKPAGE);
			
		}elseif(NOSCRIPT===false && $formitem['Err'] > 1){
			AjaxConfDisp($formitem);
		}else{
			zeromailAjax_send($formitem);
		}
	}

}


/************************************************************
 *
 * 送信された値のチェック
 *
 ************************************************************/
function value_check($POST){
	
	global $formURL,$blocktxt,$blockIP;
	
	RemoveFiles(UPLOADPASS);//file delete
	
	$formitem = array();
	$error = 1;
	
	//hiddenの必須指定
	if(isset($_POST["require"])){
		$reqnames = explode(",",$POST["require"]);
		foreach($reqnames as $reqname){
			if(! array_key_exists($reqname, $POST))
				 $formitem[$reqname]=convert_encode('<strong>この項目は必須入力です。</strong>');
		}
	}
	
	foreach($POST as $key => $value){
		$name=explode("_", $key);
		
		
		if(is_array($value)){
			$value=implode("\n", $value);
		}
		
			$formitem[$name[0]]=preFilter($value);
		
		
		//必須
		if( mb_ereg("req",$key) && mb_strlen($value) < 1){
				 $formitem[$name[0]]=convert_encode('<strong>この項目は必須入力です。</strong>');
				 $error++;
		}
			
		for($i=0; $i<count($name); $i++){
		
			//全角変換
			if( $name[$i] == "jpz" && mb_strlen($value) > 0){
					$value=mb_convert_kana($value, "RNASKH", TEXTCODE); 
					$formitem[$name[0]]=$value;
			//全カタカナ
			}elseif($name[$i] == "jpk" && mb_strlen($value) > 0){
				$value=mb_convert_kana($value, "RNASKH", TEXTCODE); 
				if (preg_match("/^[ア-ン]*$/", $value)) {
					$formitem[$name[0]]=$value;
				}else{
					$formitem[$name[0]]=convert_encode('<strong>カタカナで入力してください。</strong>');
					$error++;
				}
			//全ひらがな
			}elseif($name[$i] == "jph" && mb_strlen($value) > 0){
				$value=mb_convert_kana($value, "RNASKH", TEXTCODE); 
				if (preg_match("/^[あ-ん]*$/", $value)) {
					$formitem[$name[0]]=$value;
				}else{
					$formitem[$name[0]]=convert_encode('<strong>ひらがなで入力してください。</strong>');
					$error++;
				}
			
			//カタカナorひらがな

			}elseif($name[$i] == "jpa" && mb_strlen($value) > 0){
				$value=mb_convert_kana($value, "RNASKH", TEXTCODE); 
				if (preg_match("/^[あ-んア-ン]*$/", $value)) {
					$formitem[$name[0]]=$value;
				}else{
					$formitem[$name[0]]=convert_encode('<strong>「ひらがな」または「カタカナ」で入力してください。</strong>');
					$error++;
				}
			//数字
			}elseif($name[$i] == "num" && mb_strlen($value) > 0){
				$value = mb_convert_kana($value, "n", TEXTCODE);
				if (preg_match("/^[0-9]*$/", $value)) {
					$formitem[$name[0]]=$value;
				}else{
					$formitem[$name[0]]=convert_encode('<strong>数字以外は入力出来ません。</strong>');
					$error++;
				}

			//英字
			}elseif( $name[$i] == "eng" && mb_strlen($value) > 0){
				$value =  mb_convert_kana($value,"as", TEXTCODE);
				if (!preg_match("/^[a-zA-Z0-9]+$/", $value)) {
					$formitem[$name[0]]=convert_encode('<strong>半角英数以外は使用できません。</strong>');
					$error++;
					
				}else{
					$formitem[$name[0]]=$value;
				}
		
			//名前
			}elseif( stristr($name[0],"name")!==false ){
				if($name[0] == "name" && mb_strlen($value) < 1 && NAMECHECK == true){
					$formitem[$name[0]]=convert_encode('<strong>この項目は必須入力です。</strong>');
					$error++;
				}elseif(ALPHANAME == false && preg_match("/^[\x01-\x7e]+$/",$value)){
					$formitem[$name[0]]=convert_encode('<strong>全て半角英数の文字列は使用できません。</strong>');
					$error++;
				}else{
					$formitem[$name[0]]=htmlentities($value,ENT_QUOTES, TEXTCODE);
				}
			
			//メアド
			}elseif( stristr($name[0],"email")!==false){
				if((mb_strlen($value) < 1 && (REPLY == true || $_POST["reply"] =="true")) || (mb_strlen($value) < 1 &&EMAILCHECK === true )){
					$formitem[$name[0]]=convert_encode('<strong>メールアドレスを入力してください。</strong>');
					$error++;
				}elseif(mb_strlen($value) > 0 && !preg_match("/^([a-z0-9_]|\-|\.|\+)+@(([a-z0-9_]|\-)+\.)+[a-z]{2,6}$/i",$value)){
					$formitem[$name[0]]=convert_encode('<strong>入力したメールアドレスを確認して下さい。</strong>');
					$error++;
				}
			
			//URL
			}elseif( stristr($name[0],"url")!==false && mb_strlen($value) > 0){
				if(!preg_match('/^(https|http)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)$/', $value)) {
				$formitem[$name[0]]=convert_encode("<strong>URLはhttpから始まるアドレスを入力してください。</strong>");
				$error++;
				
				}
			
			//電話
			}elseif( stristr($name[0],"tel")!==false && mb_strlen($value) > 0){
				$value = mb_convert_kana($value, "n", TEXTCODE);
				if(strpos($value,"-")===false){
					if (!preg_match("/(^(?<!090|080|070)\d{10}$)|(^(090|080|070)\d{8}$)|(^0120\d{6}$)|(^0080\d{7}$)/", $value)) {
						$formitem[$name[0]]=convert_encode("<strong>入力した電話番号を確認して下さい。</strong>");
						$error++;
					}else{
						$formitem[$name[0]]=$value;
					}
				}else{
					if (!preg_match("/(^(?<!090|080|070)(^\d{2,5}?\-\d{1,4}?\-\d{4}$|^[\d\-]{12}$))|(^(090|080|070)(\-\d{4}\-\d{4}|[\\d-]{13})$)|(^0120(\-\d{2,3}\-\d{3,4}|[\d\-]{12})$)|(^0080\-\d{3}\-\d{4})/", $value)) {
						$formitem[$name[0]]=convert_encode("<strong>入力した電話番号を確認して下さい。</strong>");
						$error++;
					}else{
						$formitem[$name[0]]=$value;
					}
				}
				
			
			//郵便番号
			}elseif( stristr($name[0],"zipcode")!==false && mb_strlen($value) > 0){
				$value = mb_convert_kana($value, "n", TEXTCODE);
				if (!preg_match("/(^\d{3}\-\d{4}$)|(^\d{7}$)/", $value)) {
					$error++;
					$formitem[$name[0]]=convert_encode("<strong>入力した郵便番号を確認して下さい。</strong>");
				}
			//本文
			}elseif( stristr($name[0],"message")!==false && mb_strlen($value) > 0){
			
			if(preg_match("/^[\x01-\x7e]+$/",$value)){
					$formitem[$name[0]]=convert_encode('<strong>日本語で書いてください。</strong>');
					$error++;
				}elseif (substr_count(strtolower($value), 'http') > $alink){//リンク数チェック
					$formitem[$name[0]]=convert_encode('<strong>リンクの記述は認められていません。</strong>');
					$error++;
				}elseif(is_array($blocktxt)&&count($blocktxt)>0){//禁止語句チェック
					foreach($blocktxt as $fuck){
						if (strstr($value,$fuck) === false){
							$formitem[$name[0]]=preFilter($value);
						}else{
							$formitem[$name[0]]=convert_encode('<strong>禁止語句が含まれているようです。</strong>');
							$error=1;
							break;
						}

					}
				}else{
					$formitem[$name[0]] = preFilter($value);
				}
				
			}//end:preg_match
		}//end:for
	}//end:foreach

	if(isset($_FILES)&&count($_FILES)!=0){
		$error += checkUploadData($_FILES);
	}
	
	$formitem['Err'] = $error;
	
	return $formitem;
	
}

/************************************************************
 *
 * 添付ファイルのチェック
 *
 ************************************************************/
function checkUploadData($FILES)
{
	$err = 0;
	
	foreach ($FILES as $name => $array) {
		$filename = strtolower(basename($array["name"]));
		
		if ($array["error"] == 0) {
			$tmp_name =$array["tmp_name"];
			$filesize = $array["size"];
			$filetype = $array['type'];
			preg_match("/^.+?\.([\w]{3})$/i", $filename, $extension);//拡張子

			if(!check_minetype($filetype, $extension[1])){
				$_SESSION[$name] = convert_encode($label."[".$filename."] のファイル形式が不適切です。");
				$err = 1;
			}
			
			if($filesize >= MAXSIZE*1000 ){ //ファイルサイズ
				$_SESSION[$name] = convert_encode($label."[".$filename."] のファイルサイズ(".($filesize/1000)."kb)が大きすぎます");
				$err = 1;
			}
			
			if(!$err){
				if(! preg_match("/^([a-z0-9_\-\.]+?)\.([\w]{3})$/i", $filename, $matches)){//画像が日本語だったら
					$filename= substr(md5(microtime()), 0, rand(5, 8)).get_extension($filetype, $matches[2]);//適当に名前付ける
				}else{
					$filename = strtolower($filename);
				}
				
				$_SESSION[$name] = convert_encode($filename."(".($filesize/1000)."kb)".'　［<a href="'.UPLOADPASS.$filename.'" target="_blank">ファイルの確認</a>］');
				$_SESSION["FILES"][] = array('filename'=>$filename, 'type' =>$filetype);
				$_SESSION["FILETEMP"] = true;
				
				//tmpファイルを移動
				move_uploaded_file($tmp_name,UPLOADPASS.$filename);
				
				
			}
			
		}elseif($array["error"] != 4){
				
			switch($array["error"]){
				case 1:
					$_SESSION[$name] = convert_encode("[".$filename."] のファイルサイズが大きすぎます");
					$err = 1;
				break;
				
				case 2:
					$_SESSION[$name] = convert_encode("[".$filename."] のファイルサイズが大きすぎます");
					$err = 1;
				break;
				
				case 6:
					$_SESSION[$name] = convert_encode("テンポラリフォルダがありません");
					$err = 1;
				break;
				
				default:
					$_SESSION[$name] = convert_encode("[".$filename."] はアップロードできませんでした");
					$err = 1;
			}
			
		}
		
	}
	if(isset($err)){
		return $err;
	}
	
}

/************************************************************
 *
 * Ajax用入力エラー表示
 *
 ************************************************************/
function AjaxConfDisp($formitem){
	
	global $inputs,$replycomment;
		
		print '<div id="error"><p><span class="err">入力エラーを修正してください。'.NOSCRIPT.'</span></p>';
	
		switch(VIEWSTYLE){
			case 'Table':
				echo '<table>';
				foreach( $inputs as $key => $value){
					echo '<tr><th scope="row">'.$value.'</th><td>';
					echo $formitem[$key];
					echo '</td></tr>';
				}
				echo '</table>';
			break;
			
			case'List':
				echo '<dl>';
				foreach( $inputs as $key => $value){
					echo '<dt>'.$value.'</dt><dd>';
					echo $formitem[$key];
					echo '</dd>';
				}
				echo '</dl>';
			break;
			
			default:
				echo '<p>';
				foreach( $inputs as $key => $value){
					echo '<p><strong>'.$value.'</strong><span>';
					echo $formitem[$key];
					echo '</span></p>';
				}
			echo '</p></div>';
		}
}

/************************************************************
 *
 * 送信関数
 *
 ************************************************************/
 
function zeromailAjax_send($formitem)
{
	global $inputs, $endMassage,$replyfoot,$replycomment;
	
	ip_check_destroy();
	
	//ユーザー情報
	$user ="DATE: ".date("Y/m/d - H:i:s")."\n";
	$user.="IP: ".$_SERVER['REMOTE_ADDR']."\n";
	$user.="HOST: ".@gethostbyaddr($_SERVER['REMOTE_ADDR'])."\n";
	$user.= "USER AGENT: ".$_SERVER['HTTP_USER_AGENT']."\n";
	$copy =SCRIPT."[http://tenderfeel.xserv.jp/zeromail/]";

//本文スタイル
$message=MAILSUBJECT;
$message.="\n────────────────────────────────────";
foreach( $inputs as $key => $value){
	if(preg_match("/［<a href=\"(.+)\" target=\"_blank\">ファイルの確認<\/a>］/",$formitem[$key]))
	$formitem[$key] = preg_replace("/［<a href=\"(.+)\" target=\"_blank\">ファイルの確認<\/a>］/","",$formitem[$key]);
$message.= <<<EOM
\n■$value
{$formitem[$key]}\n
EOM;
}
$message.= <<<EOM
────────────────────────────────────
□ユーザー情報
$user
────────────────────────────────────
$copy
EOM;
	
	//本文整形
	if(strpos(PHPVER,'5')===false){
		$message = unhtmlentities($message);
	}else{
		$message = html_entity_decode($message,ENT_QUOTES,'UTF-8');
	}
	
	$message = str_replace("\r","",str_replace("<br />","",$message));
	
	$name = isset($formitem["name"])? $formitem["name"] : SCRIPT."_ver".VERSION;
	
	//送信者
	if(!$formitem['email']) $mailfrom = $name." <".SCRIPT."@Ver".VERSION.">";
	else $mailfrom = $name." <".$formitem['email'].">";
	
	//添付ファイルなし
	if(FILETEMP === false || (FILETEMP === true && $formitem["FILETEMP"] !== true)){
		
		$mailheader ="From: $mailfrom\r\n";
		if(BCC != "") $mailheader.="Bcc: ".BCC."\r\n";
		$mailheader.="X-Mailer: ".SCRIPT."(Version ".VERSION.")\r\n";
	
		mb_send_mail(MAILTO,MAILSUBJECT,$message,$mailheader);
	
	//添付ファイルあり
	}elseif(FILETEMP === true && $formitem["FILETEMP"]===true){
		$msg = "";
		$boundary = "zeromail".md5(uniqid(rand()));//バウンダリー
		$mailfrom = "=?iso-2022-jp?B?". base64_encode($mailfrom). "?=";
		$mailheader = "From: $mailfrom\n";
		if(BCC != "") $mailheader.="Bcc: ".BCC."\n";
		$mailheader .= "Reply-To: $mailfrom\n";
		$mailheader .= "X-Mailer: ".SCRIPT."(Version ".VERSION.")\n";
		$mailheader .= "MIME-version: 1.0\n";
		$mailheader .= "Content-Type: multipart/mixed;\n";
		$mailheader .= "\tboundary=\"$boundary\"\n";
		$msg .= "This is a multi-part message in MIME format.\n\n";
		$msg .= "--$boundary\n";
		$header .= "Content-transfer-encoding: 7bit\n";
		$header .= "Content-type: text/plain; charset=\"iso-2022-jp\"\n\n";
		
		$msg .= mb_convert_encoding($message, "JIS", TEXTCODE);
		
		foreach($formitem["FILES"] as $i => $tmp){
			$fp = fopen(UPLOADPASS.$tmp["filename"], "r"); //ファイルの読み込み
			$contents = fread($fp, filesize(UPLOADPASS.$tmp["filename"]));
			fclose($fp);
			$encoded = base64_encode($contents); //エンコード
			$msg .= "\r\n\r\n--$boundary\n";
			$msg .= "Content-Type: " . $tmp["type"] . ";\n";
			$msg .= "\tname=\"".$tmp["filename"]."\"\n";
			$msg .= "Content-Transfer-Encoding: base64\n";
			$msg .= "Content-Disposition: attachment;\n";
			$msg .= "\tfilename=\"".$tmp["filename"]."\"\n\n";
			$msg .= $encoded."\n";
		}
		
		RemoveFiles(UPLOADPASS);//ファイル削除
		
		$msg .= "--$boundary--";
		
		$subject = "=?iso-2022-jp?B?".base64_encode(mb_convert_encoding(MAILSUBJECT, "JIS", TEXTCODE)). "?=";
		mail(MAILTO,$subject, $msg, $mailheader);
	}
	
	//メール自動返信
	if( ( $formitem['reply'] === "true" || REPLY === true ) && $formitem['email'] != "" ){
		$replyheader ="From: ".FROMNAME."<".MAILTO.">\r\n";
		if(BCC != "") $replyheader.="Bcc: ".BCC."\r\n";
		$replyheader.="X-Mailer: ".SCRIPT."(Version ".VERSION.")\r\n";
		
//自動返信本文スタイル
$replymessage=$replycomment;
foreach( $inputs as $key => $value){
	if(preg_match("/［<a href=\"(.+)\" target=\"_blank\">ファイルの確認<\/a>］/",$formitem[$key]))
	$formitem[$key] = preg_replace("/［<a href=\"(.+)\" target=\"_blank\">ファイルの確認<\/a>］/","",$formitem[$key]);
$replymessage.= <<<EOM
\n■$value
{$formitem[$key]}\n
EOM;
}
$replymessage.= <<<EOM
$replyfoot
EOM;

	//自動返信本文整形
	if(strpos(PHPVER,'5') === false){
		$replymessage = unhtmlentities($replymessage);
	}else{
		$replymessage = html_entity_decode($replymessage, ENT_QUOTES, 'UTF-8');
	}
		$replymessage = str_replace("\r","",str_replace("<br />","", $replymessage));
		
		mb_send_mail($mailfrom, REPSUBJECT, $replymessage, $replyheader);
	}
	
	
	session_destroy();
	
	if(NOSCRIPT === false){
		
		print $endMassage;
		
	}else{
		
		header('Location: '.SUCCESS);

	}
	
}

/*-----------------------------------------------------
  添付ファイル削除
------------------------------------------------------*/
function RemoveFiles($dir) {
    if(!$dh = @opendir($dir)) return;
    while (false !== ($obj = readdir($dh))) {
        if($obj=='.' || $obj=='..') continue;
        @unlink($dir.'/'.$obj);
    }
    closedir($dh);
}

/*-----------------------------------------------------
  ファイルタイプのチェック
------------------------------------------------------*/
function check_minetype($filetype, $extension)
{
	$minetype = array("image/jpeg","image/pjpeg","image/x-png","image/png","image/gif","application/pdf","application/octet-stream","application/x-shockwave-flash","text/plain");
	$ext  = array("gif","png","jpg","pdf","swf","txt","xls","doc","ppt");

	if(array_search($filetype,$minetype)===false){
		return false;
	}elseif(array_search($extension,$ext)===false){
		return false;
	}else{
		return true;
	}
}

/*-----------------------------------------------------
  拡張子
------------------------------------------------------*/
function get_extension($type, $tn){
  if(empty($type)) return false;
   switch($type) {
	   case 'image/gif': return '.gif'; break;
	   case 'image/jpeg': return '.jpg'; break;
	   case 'image/pjpeg': return '.jpg'; break;
	   case 'image/png': return '.png'; break;
	   case 'image/x-png': return '.png'; break;
	   case 'application/pdf': return '.pdf'; break;
	   case 'application/x-shockwave-flash' : return '.swf'; break;
	   case 'text/plain' : return '.txt'; break;
	   case 'application/octet-stream' :
			switch($tn){
				case "xls": return ".xls"; break;
				case "doc": return ".doc"; break;
				case "ppt": return ".ppt"; break;
				default: return false;
			}
		break;
	  default: return false;
   }
}	

/*-----------------------------------------------------
  IPチェック
------------------------------------------------------*/
function ip_check_destroy()
{
	global $blockIP;
	
	if(array_search($_SERVER['REMOTE_ADDR'],$blockIP)!==false){
		if(NOSCRIPT===true){
			session_destroy();
			ErrerDisp('送信が認められていません。');
			exit;
		}else{
			session_destroy();
			print "<p class=\"err_message\">送信が認められていません。</p><p class=\"button\"><button id=\"close\">Close</button></p>";
			exit;
		}
	}
}

/*-----------------------------------------------------
  リファラチェック
------------------------------------------------------*/
function ref_check_destroy()
{
	global $formURL;
	
	if(REFCHECK === true && !strstr($_SERVER["HTTP_REFERER"], $formURL)){ //リファラーチェック
		if(NOSCRIPT===true){
			session_destroy();
			ErrerDisp($_SERVER["HTTP_REFERER"].'不正な送信元です。'.$formURL);
			exit;
		}else{
			session_destroy();
			print "<p class=\"err_message\">不正な送信元です。</p><p class=\"button\"><button id=\"close\">Close</button></p>";
			exit;
		}
	}
}

/*-----------------------------------------------------
  magic_quotes_gpc=ON対策
------------------------------------------------------*/
function preFilter($str)
{
	if (ini_get('magic_quotes_gpc')){
		$str = stripslashes_deep(nl2br(htmlentities($str, ENT_QUOTES,TEXTCODE)));
	}else{
		$str = nl2br(htmlentities($str, ENT_QUOTES,TEXTCODE));
	}
	return $str;
}

/*-----------------------------------------------------
  スラッシュ消す
------------------------------------------------------*/
function stripslashes_deep($str)
{
	$str = is_array($str) ?
		array_map('stripslashes_deep', $str) :
		stripslashes($str);
	return $str;
}

/*-----------------------------------------------------
  ver4用デコード
------------------------------------------------------*/
function unhtmlentities($string)
{
    // 数値エンティティの置換
    $string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string);
    $string = preg_replace('~&#([0-9]+);~e', 'chr("\\1")', $string);
    // 文字エンティティの置換
    $trans_tbl = get_html_translation_table(HTML_ENTITIES);
    $trans_tbl = array_flip($trans_tbl);
    return strtr($string, $trans_tbl);
}?>
